home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / sound / sndblst3.zip / VOICE.C < prev    next >
Text File  |  1993-10-25  |  8KB  |  241 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // Copyright (c) David Welch, 1993
  4. //------------------------------------------------------------------------------
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <conio.h>
  10.  
  11. #include "..\sb.h"
  12.  
  13. #define USHORT unsigned short
  14.  
  15. typedef struct
  16. {
  17.     char name[20];
  18.     unsigned short off;
  19.     unsigned short ver;
  20.     unsigned short id;
  21. } VOCHEADER;
  22.  
  23. char gstring[80];
  24. unsigned char ca;
  25. unsigned short ra;
  26. unsigned long la;
  27. FILE *fp;
  28.  
  29. VOCHEADER v;
  30. char dtype;
  31. unsigned long dlen;
  32. unsigned char tc;
  33. unsigned char pt;
  34. unsigned char md;
  35. unsigned char min;
  36. unsigned char max;
  37. unsigned long length;
  38.  
  39. void main ( int argc, char *argv[] )
  40. {
  41.     if(argc==1)
  42.     {
  43.         printf(".VOC file not specified\n");
  44.         exit(1);
  45.     }
  46.     strcpy(gstring,argv[1]);
  47.     strcat(gstring,".VOC");
  48.     if((fp=fopen(gstring,"rb"))==NULL)
  49.     {
  50.         strcpy(gstring,argv[1]);
  51.         if((fp=fopen(gstring,"rb"))==NULL)
  52.         {
  53.             printf("Error opening .VOC file [%s]\n",argv[1]);
  54.             exit(1);
  55.         }
  56.     }
  57.     printf("FILE:  [%s]\n",gstring);
  58.     sbsetup();
  59.     fread(&v,1,sizeof(VOCHEADER),fp);
  60.     for(ra=0;ra<19;ra++) gstring[ra]=v.name[ra]; gstring[ra]=0;
  61.     if((strcmp(gstring,"Creative Voice File")!=0)||(v.name[ra]!=0x1A))
  62.     {
  63.         printf("Not a Creative Voice File (.VOC)\n");
  64.         exit(1);
  65.     }
  66.     printf("Creative Voice File  V%u.%02u\n",(v.ver>>8)&0xFF,v.ver&0xFF);
  67.     printf("Data starts at offset %08Xh\n",v.off);
  68.     printf("Voice file identification code %04Xh, ",v.id);
  69.     if((((~v.ver)+0x1234)&0xFFFF)==v.id) printf("passed\n");
  70.     else { printf("failed\n"); exit(1); }
  71.     while(1)
  72.     {
  73.         if(fread(&dtype,1,1,fp)==0) break;
  74.         dlen=0; fread(&dlen,1,3,fp);
  75.         printf("\nBlock Type %u:  ",(USHORT)dtype);
  76.         if(dtype==0)
  77.         {
  78.             printf("Terminator\n");
  79.             break;
  80.         }
  81.         if(dtype==1)
  82.         {
  83.             printf("Voice Data\n");
  84.             printf("Block Length %lu\n",dlen);
  85.             fread(&tc,1,1,fp);
  86.             printf("Time Constant %u, ",(USHORT)tc);
  87.             ra=1000000L/(256L-tc);
  88.             printf("%u Hz\n",ra);
  89.             fread(&pt,1,1,fp);
  90.             printf("Pack type %u:  ",(USHORT)pt);
  91.             switch(pt)
  92.             {
  93.                 case 0: printf("8 bit unpacked\n"); break;
  94.                 case 1: printf("4 bit packed\n"); break;
  95.                 case 2: printf("2.6 bit packed\n"); break;
  96.                 case 3: printf("2 bit packed\n"); break;
  97.                 case 4: printf("1 channel multi\n"); break;
  98.                 case 5: printf("2 channel multi\n"); break;
  99.                 case 6: printf("3 channel multi\n"); break;
  100.                 case 7: printf("4 channel multi\n"); break;
  101.                 case 8: printf("5 channel multi\n"); break;
  102.                 case 9: printf("6 channel multi\n"); break;
  103.                 case 10: printf("7 channel multi\n"); break;
  104.                 default: printf("Unknown\n"); break;
  105.             }
  106.             if(pt==0)
  107.             {
  108.                 sbsettc(tc);
  109.                 spkon();
  110.                 length=dlen-2;
  111.                 while(length)
  112.                 {
  113.                     if(length>65000) la=65000; else la=length;
  114.                     length-=la;
  115.                     fread(aligned,1,la,fp);
  116.                     sbplay(la);
  117.                     printf("%lu Samples\n",la);
  118.                     while(dmacount()!=0xFFFF)
  119.                     {
  120.                         if(kbhit())
  121.                         {
  122.                             sbhaltdma();
  123.                             getch();
  124.                             spkoff();
  125.                             exit(0);
  126.                         }
  127.                     }
  128.                 }
  129.                 spkoff();
  130.             }
  131.             else
  132.             {
  133.                 printf("Invalid pack type\n");
  134.                 fseek(fp,ftell(fp)+dlen-2,0);
  135.             }
  136.         }
  137.         if(dtype==2)
  138.         {
  139.             printf("Voice Continuation\n");
  140.             printf("Block Length %lu\n",dlen);
  141.             max=0x00;
  142.             min=0xFF;
  143.             for(la=0;la<dlen;la++)
  144.             {
  145.                 fread(&ca,1,1,fp);
  146.                 if(ca>max) max=ca;
  147.                 if(ca<min) min=ca;
  148.             }
  149.             printf("Maximum %u, Minimum %u\n",(USHORT)max,(USHORT)min);
  150.         }
  151.         if(dtype==3)
  152.         {
  153.             printf("Silence\n");
  154.             printf("Block Length (always 3) %lu\n",dlen);
  155.             fread(&ra,1,2,fp);
  156.             printf("Period %u\n",ra);
  157.             fread(&tc,1,1,fp);
  158.             printf("Time Constant %u, ",(USHORT)tc);
  159.             ra=1000000L/(256L-tc);
  160.             printf("%u Hz\n",ra);
  161.         }
  162.         if(dtype==4)
  163.         {
  164.             printf("Marker");
  165.             printf("Block Length %lu\n",dlen);
  166.             fread(&ra,1,2,fp);
  167.             printf("Marker value %u, %04Xh\n",ra,ra);
  168.             if(dlen>2) fseek(fp,ftell(fp)+dlen-2,0);
  169.         }
  170.         if(dtype==5)
  171.         {
  172.             printf("ASCII Text\n");
  173.             printf("Block Length %lu\n",dlen);
  174.             la=dlen;
  175.             while(la)
  176.             {
  177.                 if(la>79) ca=79; else ca=la;
  178.                 la-=ca;
  179.                 fread(gstring,1,ca,fp); gstring[79]=0;
  180.                 printf("%s",gstring);
  181.             }
  182.         }
  183.         if(dtype==6)
  184.         {
  185.             printf("Repeat Loop\n");
  186.             printf("Block Length (always 2) %lu\n",dlen);
  187.             fread(&ra,1,2,fp);
  188.             printf("Count %u\n",ra);
  189.         }
  190.         if(dtype==7)
  191.         {
  192.             printf("End Repeat Loop\n");
  193.             printf("Block Length (always 0) %lu\n",dlen);
  194.         }
  195.         if(dtype==8)
  196.         {
  197.             printf("Extended Block\n");
  198.             printf("Block Length (always 4) %lu\n",dlen);
  199.             fread(&ra,1,2,fp);
  200.             printf("Time constant %u, ",ra);
  201.             ra=256000000L/(65536L-ra);
  202.             printf("%u Hz\n",ra);
  203.             fread(&pt,1,1,fp);
  204.             printf("Pack type %u:  ",(USHORT)pt);
  205.             switch(pt)
  206.             {
  207.                 case 0: printf("8 bit unpacked\n"); break;
  208.                 case 1: printf("4 bit packed\n"); break;
  209.                 case 2: printf("2.6 bit packed\n"); break;
  210.                 case 3: printf("2 bit packed\n"); break;
  211.                 case 4: printf("1 channel multi\n"); break;
  212.                 case 5: printf("2 channel multi\n"); break;
  213.                 case 6: printf("3 channel multi\n"); break;
  214.                 case 7: printf("4 channel multi\n"); break;
  215.                 case 8: printf("5 channel multi\n"); break;
  216.                 case 9: printf("6 channel multi\n"); break;
  217.                 case 10: printf("7 channel multi\n"); break;
  218.                 default: printf("Unknown\n"); break;
  219.             }
  220.             fread(&md,1,1,fp);
  221.             printf("Mode %u, ",(USHORT)md);
  222.             switch(md)
  223.             {
  224.                 case 0: printf("mono\n"); break;
  225.                 case 1: printf("stereo\n"); break;
  226.                 default: printf("unknown\n"); break;
  227.             }
  228.         }
  229.         if(dtype>8)
  230.         {
  231.             printf("UNKNOWN\n");
  232.             printf("Block Length %lu\n",dlen);
  233.             fseek(fp,ftell(fp)+dlen,0);
  234.         }
  235.     }
  236. }
  237. //------------------------------------------------------------------------------
  238. // Copyright (c) David Welch, 1993
  239. //------------------------------------------------------------------------------
  240.  
  241.